-------------------模块区-------------------
local string_util = require("string_util")
local dx_map = require("dx_map")
local log = require("mylog")
local dx_json = require("dx_json")
local net = require("dx_net")
local dx_sysinfo = require("dx_sysinfo")

-------------------变量区-------------------
local config = {}
-- 下面所有的k-v配置在这个表里面都能找到---下面有默认值的配置共45条
g_config = {}

local netInfo = {}
-- wifi名
netInfo.ssid = ""
-- wifi密码
netInfo.pwd = ""
-- 是否为DHCP(1:静态，2:动态)
netInfo.dhcp = "2"

-- 因加载流程问题，当下还没有网络信息，待网络初始化完成后填补
-- 	ip地址
netInfo.local_ip = "待入网"
-- 网关
netInfo.local_gateway = "待入网"
-- DNS服务器
netInfo.local_dns = "待入网"
-- 子网掩码
netInfo.local_netmask = "待入网"

-- mqtt配置信息
local mqtt_info = {}
-- Mqtt地址（ip）默认开发环境
mqtt_info.mqttAddr = "101.200.139.97"
-- mqtt_info.mqttAddr = "192.168.10.59"
-- Mqtt地址（端口）默认开发环境
mqtt_info.port = "50007"
-- mqtt_info.port = "1883"
-- 客户端id，与设备地址一致
mqtt_info.clientId = dx_sysinfo.sysinfo_get_uuid(17)
-- mqtt_info.clientId = "dxinside"
-- mqtt用户名
mqtt_info.mqttName = "admin"
-- mqtt密码
mqtt_info.password = "123456"

-- 设备基础配置信息
local baseInfo = {}
-- 系统时间
baseInfo.time = os.time()
-- 系统版本号
baseInfo.sysVersion = "暂定查询c接口"
-- 应用版本号
baseInfo.appVersion = "赋默认值，升级的同时进行更新"
-- 应用发布日期
baseInfo.createTime = "赋默认值，升级的同时进行更新"
-- 设备地址（uuid）
baseInfo.uuid = dx_sysinfo.sysinfo_get_uuid(17)
-- baseInfo.uuid = "dxinside"
-- 设备名称
baseInfo.deviceName = ""
-- 	设备类型
baseInfo.model = "cc101"
-- 设备基本状态 0-未激活 1-正常 2-禁用
baseInfo.deviceStatus = 1

-- 设备系统资源信息
local sysInfo = {}
-- CPU 占用比率 %
sysInfo.cpu = 1
-- 内存剩余空间 单位是 kb
sysInfo.memroy = dx_sysinfo.sysinfo_get_freemem() / 1024
-- 设备剩余空间 单位是 kb
sysInfo.disk = dx_sysinfo.sysinfo_get_freedisk() / 1024

-- 设备开门相关配置信息
local door = {}
-- 设备开门模式，0-正常，1-常开模式，2-常闭模式
door.mode = "0"
-- 开门时长，单位秒
door.openTime = "3"

-- 日志初始化配置
local mylog_config = {}
-- 日志打印是否使用颜色
mylog_config.usecolor = true
-- 输出日志文件路径
mylog_config.outpath = "/dx_cc101_app/data/"
-- 日志等级（trace,debug,info,warn,error,fatal）
mylog_config.level = "debug"
-- 最大日志存储量为max_size*2 字节,缺省是500k*2，大概1m
mylog_config.max_size = 512000

-- 运行时状态
local runing_config = {}
-- 禁用状态
runing_config.disable_status = false
-- mqtt连接状态
runing_config.mqtt_con_status = false
-- 网络状态
runing_config.network_status = false
-- 门磁状态
runing_config.sen_status = 0
runing_config.sen_time = os.time()
-- 火警状态
runing_config.fire_status = 0
runing_config.fire_time = os.time()
-- 出门开关状态
runing_config.exit_status = 0
runing_config.exit_time = os.time()
-- 启动状态（0：重置，1：正常，2：升级，3：看门狗）
runing_config.run_status = 3

DATA_TYPE = {
    DATA_TYPE_A = 0x40,
    DATA_TYPE_MIFARE_ULTRALIGHT = 0x41,
    -- //4字节的mifare classic ev1 1k
    DATA_TYPE_MF1S503 = 0x42,
    -- //7字节的mifare classic ev1 1k
    DATA_TYPE_MF1S500 = 0x52,
    -- //4字节的mifare classic ev1 4k
    DATA_TYPE_MF1S703 = 0x43,
    DATA_TYPE_CPU_A = 0x44,
    DATA_TYPE_MIFARE_DESFIRE = 0x45,
    DATA_TYPE_IDENTITY_CARD = 0x46,
    DATA_TYPE_15693_CARD = 0x47,
    DATA_TYPE_B = 0x4a,
    DATA_TYPE_CPU_B = 0x4b,
    DATA_TYPE_M1 = 0x4c,
    DATA_TYPE_FELICA = 0x4d,
    DATA_TYPE_MIFARE_PLUS = 0x4e,
    DATA_TYPE_IDCARD = 0x61,
    DATA_TYPE_NOT_SUPPORT = 0x7f,
    -- BM10蓝牙
    DATA_TYPE_BLUETOOTH_A = 0x80
}

-------------------函数区-------------------
-- 设备启动时调用，读取文件配置到内存
function config.config_init()
    log.debug("初始化读取配置信息！")
    local ret

    readcfg()

    -- 填充device_info、mqtt_params、wifi_info等主要配置信息
    ret = config.config_refresh_all()
    if ret ~= 0 then
        log.debug("读取配置失败！")
        return -1
    end

    if isEmpty(g_config) then
        log.debug("读取配置失败！")
        return -1
    end

    return 0
end

-- 填充device_info、mqtt_params、wifi_info等主要配置信息
function config.config_refresh_all()
    --设备配置信息
    config.config_get_net_param()
    --设备配置信息
    config.config_get_deviceinfo()
    -- mqtt配置信息
    config.config_get_mqttparam()
    -- 日志初始化配置信息
    config.config_mylog()
    -- 运行时状态
    config.config_runing()
    -- 系统信息
    config.config_sysInfo()
    -- 设备开门相关配置信息
    config.config_door()

    return 0
end

-- 网络配置信息
function config.config_get_net_param()
    local keys = {
        "type",
        "ssid",
        "pwd",
        "dhcp",
        "local_ip",
        "local_gateway",
        "local_dns",
        "local_netmask"
    }
    config.batch_get_value(keys, netInfo)
    for k, v in pairs(netInfo) do
        g_config[k] = v
    end
end

-- 设备基础配置信息
function config.config_get_deviceinfo()
    local keys = {
        "time",
        "sysVersion",
        "appVersion",
        "createTime",
        "uuid",
        "deviceName",
        "deviceStatus",
        "model"
    }
    config.batch_get_value(keys, baseInfo)
    for k, v in pairs(baseInfo) do
        g_config[k] = v
    end
end

-- mqtt配置信息
function config.config_get_mqttparam()
    local keys = {"mqttAddr", "port", "clientid", "mqttName", "password"}
    config.batch_get_value(keys, mqtt_info)
    for k, v in pairs(mqtt_info) do
        g_config[k] = v
    end
end

-- 运行时状态信息
function config.config_runing()
    local keys = {
        "disable_status",
        "mqtt_con_status",
        "network_status",
        "sen_status",
        "sen_time",
        "fire_status",
        "fire_time",
        "exit_status",
        "exit_time",
        "run_status"
    }
    config.batch_get_value(keys, runing_config)
    for k, v in pairs(runing_config) do
        g_config[k] = v
    end
end

-- 日志配置信息
function config.config_mylog()
    local keys = {"usecolor", "outpath", "level", "max_size"}
    config.batch_get_value(keys, mylog_config)
    for k, v in pairs(mylog_config) do
        g_config[k] = v
    end
end

-- 系统信息
function config.config_sysInfo()
    local keys = {"memroy", "disk", "cpu"}
    config.batch_get_value(keys, sysInfo)
    for k, v in pairs(sysInfo) do
        g_config[k] = v
    end
end

-- 设备开门相关配置信息
function config.config_door()
    local keys = {"mode", "openTime"}
    config.batch_get_value(keys, door)
    for k, v in pairs(door) do
        g_config[k] = v
    end
end

-- 从lua全局表中获取配置信息
function config.batch_get_value(keys, fillTable)
    local value
    if keys ~= nil then
        for i, v in pairs(keys) do
            value = getvalue(v)
            if value ~= nil then
                fillTable[v] = value
            end
        end
    end
end

function isEmpty(valid_table)
    local size = 0
    if valid_table ~= nil then
        for k, v in pairs(valid_table) do
            if v ~= nil then
                size = size + 1
            end
        end
    end
    if size > 0 then
        return false
    end
    return true
end

-- 保存配置到文件
function config.saveConfigToFile()
    local g_config_str = dx_map.get(_G["_G_map"], "g_config_str")
    log.debug("[saveConfigToFile]即将持久化到数据库中的配置信息：", g_config_str)
    local g_config = dx_json.decode(g_config_str)
    vbar_config_t = g_config
    writecfg()
end

-- 从dx_map中获取g_config_str，vbar_config_t_str，并转换为表
function config.configStrToTable()
    -- 加载全局map资源
    local _G_map = _G["_G_map"]
    local g_config_str = dx_map.get(_G_map, "g_config_str")
    local vbar_config_t_str = dx_map.get(_G_map, "vbar_config_t_str")
    g_config = dx_json.decode(g_config_str)
    -- 更新内存和存储的值
    g_config.memroy = dx_sysinfo.sysinfo_get_freemem() / 1024
    -- 设备剩余空间 单位是 kb
    g_config.disk = dx_sysinfo.sysinfo_get_freedisk() / 1024
    -- 更新系统时间
    g_config.time = os.time()

    vbar_config_t = g_config
end

-- g_config转换为str，并放入全局map
function config.configTableToStr()
    local g_config_str = dx_json.encode(g_config)
    dx_map.set(_G_map, "g_config_str", g_config_str)
end

-- 获取卡片类型值和id值
function config.getTypeAndIdWithType(dtype)
    if DATA_TYPE.DATA_TYPE_MF1S500 == dtype then
        return 202, 7
    elseif DATA_TYPE.DATA_TYPE_M1 == dtype then
        return 202, 4
    elseif DATA_TYPE.DATA_TYPE_MF1S503 == dtype then
        return 202, 7
    elseif DATA_TYPE.DATA_TYPE_BLUETOOTH_A == dtype then
        -- BM10蓝牙
        return 404, 7
    else
        return 202, 4
    end
end

return config
